# 学习笔记
#1.0 str.title() 将字符串中英文字符串输出为首字母大写其余字母小写的形式，汉字还是按照汉字输出
#2.0 关键字实参的顺序无关紧要，因为Python知道各个值该存储到哪个形参中。下面两个函数调用是等效的
#    describe_pet(animal_type='hamster', pet_name='harry')
#    describe_pet(pet_name='harry', animal_type='hamster')
#3.0 python作为一门脚本语言，即使存在相同函数定义，其调用取决其上文最近的一个定义
#4.0 使用默认值实参，必须在函数定义的时候，将默认参数放在非默认参数后面
#5.0 调用者无论使用哪一种传递实参的方式，在当前函数调用中只能采用其中一种方式，不能两个实参采用不同的传参方式
#6.0 如不想传入列表被修改，可以传入list的副本，格式为function(List[:]),传入副本会影响运行效率

## 函数基本认识
print("函数的基本认识") 
def greet_user(username):
    """打印一些信息"""
    print("hello,"+username.title()+"!")    #str.title() 将字符串输出为首字母大写其余字母小写的形式
    
greet_user('你好')
greet_user('赛ui的哈斯d巴')                 # 输出：赛Ui的哈斯D巴

## 函数传递实参方式一：位置实参
print("\n函数传递实参方式一：位置实参")
def describe_pet(animal_type, pet_name):
    """显示仓鼠的名字信息"""
    print("I have a " + animal_type + ".")
    print("My " + animal_type + "'s name is " + pet_name.title() + ".")
describe_pet('hamster', 'harry')

## 函数传递实参方式二：关键值实参
print("\n函数传递实参方式二：关键值实参")
def describe_pet(animal_type, pet_name):
    """显示宠物的信息"""
    print("I have A " + animal_type + ".")
    print("My " + animal_type + "'s name is " + pet_name.title() + ".")
describe_pet(animal_type='hamster', pet_name='harry')         #使用关键字实参时，务必准确地指定函数定义中的形参名

## 函数传递实参方式三：默认值
print("\n函数传递实参方式三：默认值实参")
def describe_pet(pet_name,animal_type='dog'):
#def describe_pet(animal_type='dog',pet_name):
    """显示宠物的信息"""
    print("I have a " + animal_type +".")
    print("My " + animal_type + "'s name is " + pet_name.title() + ".")
describe_pet(pet_name='willie')                                #函数定义中若存在默认实参，调用者没显示传递此实参，则函数会使用默认实参

## 函数传递实参方式四：可选实参，使用默认值实现
print("\n函数传递实参方式四：可选实参")
def get_formatted_name(first_name, last_name, middle_name=''):
    """返回整洁的姓名"""
    full_name = first_name + ' ' + middle_name + ' ' + last_name
    # 这里对middle_name的判断，实际效果是一样的，因为middle_name使用其默认值时，其默认值是''，不影响实际输出
    #if middle_name:
    #    full_name = first_name + ' ' + middle_name + ' ' + last_name
    #else:
    #    full_name = first_name + ' ' + last_name
    return full_name.title()
musician = get_formatted_name('jimi', 'hendrix')
print(musician)
musician = get_formatted_name('john', 'hooker', 'lee')
print(musician)

## 函数返回值：字典
print("\n函数返回值：字典")
def build_person(first_name, last_name):
    """返回一个字典，其中包含有关一个人的信息"""
    person = {'first': first_name, 'last': last_name}
    return person
musician = build_person('jimi', 'hendrix')
print(musician)

### 函数与while的结合使用
#print("\n函数与while的结合使用")
#def get_formatted_name(first_name, last_name):
#    """返回整洁的姓名"""
#    full_name = first_name + ' ' + last_name
#    return full_name.title()
## 这是一个无限循环!
#while True:
#    print("\nPlease tell me your name:直接回车可退出当前循环")
#    f_name = input("First name: ")
#    if f_name == '':
#        break
#    l_name = input("Last name: ")
#    formatted_name = get_formatted_name(f_name, l_name)
#    print("\nHello, " + formatted_name + "!")

## 以列表作为参数传入函数
print("\n以列表作为参数传入函数")
def greet_users(usersname):
    """向列表中的每位用户都发出简单的问候"""
    for name in usersname:
        print("hi,"+name.title())
usersNameList = ["w hm","l xp"]
greet_users(usersNameList)

## 在函数中修改列表，将会永久修改此列表
print("\n在函数中修改列表，将会永久修改此列表")
# 首先创建一个列表，其中包含一些要打印的设计
unPrintdesignsList = ['iphone case','robot pendant','dodecahedron']
completedModeList = []
# 模拟打印每个设计，直到没有未打印的设计为止
# 打印每个设计后，都将其移到列表completed_models中
def printAllMode(unPrintdesignedList,completedModeList):    
    while unPrintdesignedList:
        currentDesigned = unPrintdesignedList.pop()
        print("currentMode:"+currentDesigned)
        completedModeList.append(currentDesigned)
# 显示打印好的所有模型
print("The following models have been printed:")
def printAllCompletedMode(completedModeList):
    for mode in completedModeList:
        print(mode)
# 若不想传入的unPrintdesignsList被修改，则可以传入副本
#printAllMode(unPrintdesignsList[:],completedModeList)
printAllMode(unPrintdesignsList,completedModeList)
printAllCompletedMode(completedModeList);
# 验证unPrintdesignsList是否为空
if len(unPrintdesignsList) == 0:
    print('无效列表')

## 以未知参数个数作为参数传入函数
print("\n以未知参数个数作为参数传入函数")
def greet_users(*usersname):
    """向列表中的每位用户都发出简单的问候"""
    for name in usersname:
        if(type(name) == list):
            name.pop()
        else:
            print("hi,"+name)  
    for a in usersname[2]:
        print(a)
        
usersNametuple = ('w hm','l xp')
greet_users('w hm','l xp',['a','b'])

# 未知参数含义方式传入实参
print("\n未知参数含义方式传入实参")
def greet_user(first,last,**userInfor):
    """访问当前用户所有传入信息"""
    profile = {};
    profile['firstName'] = first
    profile['lastName'] = last
    for key,value in userInfor.items():
        profile[key]  = value 
    return profile
        
userInfor = greet_user('w','hm',location = 'pingchang',age = '14')
for key,value in userInfor.items():
    print(key+':'+value)


